home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD 2.1 / Amiga Developer CD v2.1.iso / Contributions / Olaf_Barthel / Tools / Debugging / Wipeout / Wipeout.doc < prev    next >
Encoding:
Text File  |  1999-10-07  |  22.2 KB  |  498 lines

  1. Wipeout -- Traces and munges memory and detects memory trashing
  2.  
  3. Written by Olaf `Olsen' Barthel <olsen@sourcery.han.de>
  4. Public Domain
  5.  
  6. ------------------------------------------------------------------------------
  7.  
  8. 1. What is it?
  9.  
  10. Wipeout is a tool to watch and manipulate how memory is being put to use by
  11. the Amiga. By "put to use" I mean allocation, deallocation, invalid attempts
  12. to do either, forgetting to do either and memory trashing in general. In the
  13. right hands, Wipeout can be used to improve the quality of Amiga software by
  14. pointing into the direction of where a memory use problem might have
  15. originated.
  16.    Wipeout works best if used together with tools like Enforcer, SegTracker,
  17. Memoration, Scratch and tnt (these five are all part of the Software Toolkit,
  18. as distributed in the 3.1 Native Developer Kit or on the Amiga Developer CD
  19. v1.1). Wipeout does not work with MungWall; it is meant to be an alternative
  20. to MungWall.
  21.    Wipeout is related to the MemWall, MemMung and MungWall tools, but unlike
  22. these offers more and different functionality. The most prominent feature of
  23. Wipeout is its ability to track and watch memory pools; MungWall and its kin
  24. did not support this.
  25.  
  26.  
  27. 2. Requirements
  28.  
  29. Wipeout requires an Amiga equipped with Kickstart 2.04 or better. Aside from
  30. the operating system version, there are no special requirements.
  31.  
  32. Since Wipeout sends its output to the built-in Amiga serial port or the
  33. parallel port, you should either have a terminal or a printer connected to
  34. your machine, or you should run a program like Sashimi or Sushi to capture its
  35. output.
  36.  
  37.  
  38. 3. What Wipeout does
  39.  
  40.  1) Except when The Enforcer is running, memory location 0 is set to
  41.     0xC0DEDBAD; programs referencing location zero will not find a NULL
  42.     string.
  43.  
  44.  2) On startup all still unallocated (i.e. "free") memory is munged with
  45.     0xABADCAFE. If this number shows up, a program is referencing memory
  46.     in the free list.
  47.  
  48.  3) Except when MEMF_CLEAR is set as a memory allocation attribute,
  49.     freshly-allocated memory is pre-munged with 0xDEADF00D. When this is used
  50.     in an Enforcer report, the caller is allocating memory and does not
  51.     initialize it before using it.
  52.  
  53.  4) Memory is filled with 0xDEADBEEF before it is freed, encouraging programs
  54.     reusing freed memory to crash. See the configuration options REUSE and
  55.     NOREUSE for more information on this subject.
  56.  
  57.  5) Since memory allocations may not be done from within interrupt code,
  58.     all such attempts will be made to fail.
  59.  
  60.  6) Calling AllocMem()/AllocVec()/AllocPooled() with a zero length parameter
  61.     or NULL pool header will be made to fail.
  62.  
  63.  7) Calling FreeMem()/FreePooled() with a zero length parameter or a NULL
  64.     memory pointer/pool header will be registered as an error.
  65.  
  66.  8) Every memory deallocation must start on a long-word boundary (i.e. the
  67.     address to deallocate from must be a multiple of four); if it does not,
  68.     it will be registered as an error.
  69.  
  70.  9) Every memory deallocation should operate only on allocated memory and
  71.     should not overlap with unallocated memory; if this happens, it will be
  72.     registered as an error. Note that it is halfway legal to partly deallocate
  73.     memory. However, Wipeout does not tolerate such behaviour.
  74.  
  75. 10) Every memory deallocation has to match the size of the original
  76.     allocation; if it does not, it will be registered as an error.
  77.  
  78. 11) If memory is to be deallocated by a routine different from the one it was
  79.     allocated with (e.g. AllocVec() followed by FreePooled()), it will be
  80.     registered as an error.
  81.  
  82. 12) If memory following or preceding the allocation is trashed, it will be
  83.     reported.
  84.  
  85. 13) If a memory pool is created with the threshold size greater than the
  86.     puddle size, it will be reported.
  87.  
  88. 14) As memory pools may not be used by more than a single task at the same
  89.     time, any attempt to do so will be reported. In any event, Wipeout will
  90.     make sure that pool accesses are properly synchronized.
  91.  
  92. 15) Trying to deallocate memory from the wrong pool will be reported as an
  93.     error.
  94.  
  95. 16) Trying to deallocate memory from a pool if that memory has already been
  96.     deallocated will be reported as an error.
  97.  
  98. 17) If a memory allocation error is detected, the memory in question will not
  99.     be deallocated.
  100.  
  101. 18) Upon returning from a memory allocation routine, Wipeout will make sure
  102.     that all scratch registers (D1/A0/A1) will be scratched. These registers
  103.     will be set to the values D1=0xD100DEAD, A0=0xA000DEAD and A1=0xA100DEAD.
  104.  
  105. 19) Supposedly orphaned memory will be reported; see below for an explanation
  106.     of orphaned memory.
  107.  
  108.  
  109. 4. How memory is being watched
  110.  
  111. Wipeout places a magic cookie before each memory allocation. Along with a wall
  112. of bytes on either side of the allocation to keep an eye on the memory just
  113. before or after the allocation. If the memory wall is trashed, Wipeout
  114. complains and shows the damaged area. If memory is trashed so bad that the
  115. cookie is completely gone, Wipeout will not consider it a walled memory
  116. allocation and lets it go. Changes are you will be corrupting the memory list
  117. and/or overwriting other memory allocation and crash soon after that.
  118.  
  119.  
  120. 5. Interaction with other programs
  121.  
  122. Wipeout needs to know the caller's return address in order to determine the
  123. name of the program that tried to allocate/deallocate memory and where the
  124. operating system call came from. Thus, if you want to run other debugging
  125. tools that redirect calls to the memory management routines, you must make
  126. sure that Wipeout will be the last program to be started.
  127.  
  128. For optimum functionality, start the SegTracker tool before Wipeout is
  129. launched. And once Wipeout is running, proceed to run Enforcer.
  130.  
  131.  
  132. 6. Command line options
  133.  
  134. Wipeout can be started only from Shell.
  135.  
  136.  ********************************************
  137.  *                                          *
  138.  * TAKE GREAT CARE when running Wipeout for *
  139.  * the   first   time   since,  other  than *
  140.  * MungWall, Wipeout cannot be told to quit *
  141.  *                                          *
  142.  ********************************************
  143.  
  144. If Wipeout is started for the first time, it will plant its patches in the
  145. operating system, modify memory location zero, munge the currently unallocated
  146. memory and wait for something to happen. I recommend to always run Wipeout
  147. in the background, like this:
  148.  
  149.    run >nil: Wipeout
  150.  
  151. Every other attempt to start Wipeout will only cause the running Wipeout
  152. configuration to be updated.
  153.  
  154. The following command line options are available:
  155.  
  156. PRESIZE=number     This sets the number of bytes to place in front of each
  157.                    allocation; minimum is 4 bytes, maximum 65535 bytes,
  158.                    default is 32 bytes.
  159.  
  160. POSTSIZE=number    This sets the number of bytes to place behind each
  161.                    allocation; minimum is 4 bytes, maximum 65535 bytes,
  162.                    default is 32 bytes.
  163.  
  164. FILLCHAR=number    The character to fill the memory walls with. This can
  165.                    be given either in decimal or in hexadecimal notation.
  166.                    Default is a rolling fill character which uses a new
  167.                    odd number between 0x81 and 0xFF for each new allocation.
  168.                    This makes it possible for Wipeout to usually catch
  169.                    errors where too much memory is copied from one
  170.                    allocation to another. Specifying a FILLCHAR disables
  171.                    the default rolling fill character feature.
  172.  
  173. PARALLEL           This option activates parallel port output; default is
  174.                    serial port output through kprintf().
  175.  
  176. NOBANNER           This option will cause Wipeout not to print its banner
  177.                    message when it is started.
  178.  
  179. REMUNGE            Use this option to tell Wipeout to munge all unallocated
  180.                    memory again. You might want to use this periodically
  181.                    since deallocated memory will continue to clear out the
  182.                    regular free memory munge pattern over time, making it
  183.                    less likely for badly-written software to trip over
  184.                    unallocated memory.
  185.  
  186. CHECK              This tells Wipeout to check all known memory allocations
  187.                    for defects and to report damages, orphaned memory
  188.                    and the list of programs being monitored.
  189.  
  190. MARK               These options are for setting and clearing memory marks.
  191. UNMARK             A mark is used in conjunction with the SHOWUNMARKED
  192.                    option which will collect and display all so far unmarked
  193.                    memory allocations. Marks can help you tell older from
  194.                    newer memory allocations.
  195.  
  196. SHOWUNMARKED       This tells Wipeout to collect and display all so far
  197.                    unmarked memory allocations. Every memory allocation
  198.                    starts out as being unmarked. Thus, telling Wipeout to
  199.                    mark all allocations, waiting a bit and then using
  200.                    the SHOWUNMARKED option will display all allocations
  201.                    done since the time you set the marks. Note that this
  202.                    option really makes sense only if you did mark any
  203.                    memory before as you will otherwise see every
  204.                    active memory allocation (but then again, this might
  205.                    be just what you wanted to see...).
  206.  
  207. TASK=name          Watch only the task(s) or all but the task(s) specified
  208.                    with the "name" parameter. Multiple task names are
  209.                    indicated by placing a "|" between the names. If the names
  210.                    are preceeded by an exclamation mark ("!"), all tasks
  211.                    except for the ones indicated are tracked. "ALL" is a
  212.                    reserved name, indicating all tasks should be tracked;
  213.                    default is "ALL".
  214.  
  215.                    When names are compared, case does not matter. What names
  216.                    are compared against the contents of the list depends upon
  217.                    the type of the task whose name should be tested. If the
  218.                    task is truly a plain Task or Process, its task node name
  219.                    will be compared. If the task is in fact a Shell process
  220.                    with a program executing in it, then the name will be
  221.                    the name of that program.
  222.  
  223.                    Note that for a Shell program, the name will include the
  224.                    complete path name the program was started with. To find
  225.                    out which names the Shell programs are using, try the
  226.                    Shell "Status" command.
  227.  
  228. NAMETAG            These options control whether each memory allocation will
  229. NONAMETAG          be tagged with the name of the allocating task's or
  230.                    command's name and origin of the call. This will eat up
  231.                    extra memory and take extra time to store, so it is not
  232.                    enabled by default. If you wish to look for memory leaks
  233.                    in your software, use the NAMETAG option as it will
  234.                    provide information on the creator of an orphaned memory
  235.                    allocation until after the creator has already exited.
  236.                    Default is NONAMETAG.
  237.  
  238. ACTIVE             These options control whether Wipeout should track and
  239. INACTIVE           test memory usage; default is ACTIVE. While Wipeout is
  240.                    inactive, memory deallocations will still be tracked, but
  241.                    deallocation errors will not be reported.
  242.  
  243. WAIT               These options control whether each task to cause a
  244. NOWAIT             Wipeout hit will be halted and wait for a [Ctrl]-C
  245.                    break signal. Make sure that you can actually send
  246.                    that signal to the task in question. Default is NOWAIT.
  247.  
  248. CONSISTENCECHECK   These options control whether Wipeout will run a
  249. NOCONSISTENCECHECK consistency check on all its memory tracking data
  250.                    structures before performing memory deallocations and
  251.                    tracked allocations. This test may slow down the operation
  252.                    of the Amiga, especially on already very slow machines.
  253.                    Still, it is required to assure proper operation of the
  254.                    program; without consistent data structures, Wipeout will
  255.                    crash or fail to perform correctly.
  256.                    Default is NOCONSISTENCECHECK.
  257.  
  258. REUSE              It is semi-legal to continue using memory after releasing
  259. NOREUSE            it through FreeMem(), etc. while you are still in Forbid()
  260.                    state. Wipeout will by default tolerate such behaviour
  261.                    (default is REUSE), but you can also make it reject this
  262.                    through the NOREUSE option. TAKE GREAT CARE WHEN USING THE
  263.                    NOREUSE OPTION as -- unfortunately -- a great number of
  264.                    programs will break if it is in effect.
  265.  
  266. SHOWFAIL           These options control whether every failed memory
  267. NOSHOWFAIL         allocation will be reported; default is NOSHOWFAIL.
  268.  
  269. AREGCHECK          These options tell Wipeout that you wish all the values
  270. NOAREGCHECK        in the address registers to be checked via SegTracker;
  271.                    default is NOAREGCHECK.
  272.  
  273. DREGCHECK          These options tell Wipeout that you wish all the values
  274. NODREGCHECK        in the data registers to be checked via SegTracker;
  275.                    default is NODREGCHECK.
  276.  
  277. STACKCHECK         These options tell Wipeout that you wish all the values
  278. NOSTACKCHECK       displayed in the stack to be checked against the
  279.                    global segment lists via SegTracker. This will tell
  280.                    you in what segment lists various return addresses on
  281.                    the stack are found, which may help in tracing the
  282.                    location of an offending command. Default is NOSTACKCHECK.
  283.  
  284. STACKLINES=number  This option lets you pick the number of lines of stack
  285.                    backtrace to display. The default is 2. If set to 0,
  286.                    no stack backtrace will be displayed. There is NO ENFORCED
  287.                    LIMIT on the number of lines.
  288.  
  289. CHECKDELAY=number  This option selects how much time has to pass between
  290.                    two automatic memory checks. A check works similar to an
  291.                    test initiated with the CHECK option. The delay is given
  292.                    in 1/10th of a second, a value of 0 disables the automatic
  293.                    tests. Default is 0.
  294.  
  295.  
  296. 7. Signals
  297.  
  298. Wipeout watches for four signals that can be sent to it either by holding down
  299. the [Ctrl]-C/[Ctrl]-D/[Ctrl]-E keys or through the Shell "Break" command.
  300. These are:
  301.  
  302. [Ctrl]-C  Check and verify all active memory allocations
  303.  
  304. [Ctrl]-D  Disable Wipeout
  305.  
  306. [Ctrl]-E  Enable Wipeout
  307.  
  308.  
  309. 8. What is orphaned memory?
  310.  
  311. The Amiga does not yet know the concept of memory ownership. Memory allocated
  312. by one task may be passed to a different task; the original allocator may then
  313. safely exit. However, it sometimes happens that tasks allocate memory and exit
  314. before that memory is deallocated. Wipeout attempts to find out whether each
  315. task that allocated memory is still active. This helps to single out memory
  316. allocations that appear to belong to noone. Note that because allocations are
  317. associated with task addresses, Wipeout may not safely recognize orphaned
  318. allocations created by Shell programs. If you want to check whether a Shell
  319. program has left orphaned memory allocations behind, close the Shell window
  320. before entering "wipeout check" or use the Shell "Run" command to start the
  321. program you suspect will be losing memory.
  322.  
  323. If you intend to track orphaned memory and memory pools, make sure that you
  324. use the NAMETAG option.
  325.  
  326.  
  327. 9. How to watch for illegal memory usage?
  328.  
  329. Wipeout can help you to find out about illegal memory usage, such as trying to
  330. read from unallocated memory, to use uninitialized allocated memory or trying
  331. to execute code that was recently unloaded from memory. However, it cannot do
  332. this all by itself: "Enforcer" and "tnt" are required to report these
  333. problems. I thought about adding a feature to Wipeout which would fill memory
  334. with a code pattern which, if accidentally executed, would cause a routine
  335. inside Wipeout to be called. I did not add it since memory trashing could have
  336. interfered with the execution of this trigger code and because nobody could
  337. guarantee that an accidental jump into memory areas initialized like this
  338. would in fact hit the jump command. Enforcer is much better at tracking such
  339. problems; it will report all read/write accesses to addresses caused by memory
  340. munged by Wipeout and it can also track execution of commands at illegal
  341. addresses. "tnt" on the other hand is able to report where an illegal command
  342. was executed, such as in an area just munged by Wipeout.
  343.  
  344.  
  345. 10. What is in a Wipeout report?
  346.  
  347. Here is a sample Wipeout report with a few annotations:
  348.  
  349.    WIPEOUT HIT
  350. 1) 12-Apr-98 20:21:29
  351. 2) Front wall was stomped upon
  352. 3) Data: 00003039 FFFFFFFF 0000FFFF 00004E28 00000001 0000002B 0000003B 00003039
  353. 4) Addr: 0856B461 08568428 083E7714 084E58AD 084EF19C 08568428 08000848 085DC278
  354. 5) Stck: 0854ECEE 083E66D4 084E58B0 08000848 0854EF36 00000001 084E5940 0854EED8
  355.    Stck: 083E6678 00F94EC6 08000848 0854EBE6 084E58A0 083E7714 00004E20 00004E28
  356. 6) Name: "New_WShell"  CLI: "allocmemtest"  "allocmemtest" Hunk 0000 Offset 000002E2
  357.    ------------------------------------------------------------------------------
  358. 7) 0x08568428 = AllocMem(12345,...)
  359.    Created on 12-Apr-98 20:21:29
  360.            by task 0x083E6678, CLI program "allocmemtest"
  361.            at "allocmemtest" Hunk 0000 Offset 000002B6
  362.    ------------------------------------------------------------------------------
  363. 8) 1 byte(s) stomped (0x08568427..0x08568427), allocation-1 byte(s)
  364. 9) 08568427: 61...................................... a...................                  
  365.  
  366.  
  367. 1) This is the time and date of the Wipeout hit, i.e. the point of time when
  368.    an invalid memory management routine call was made.
  369.  
  370. 2) This indicates what type of problem occured; in this case memory preceding
  371.    the allocation was trashed.
  372.  
  373. 3) This is a dump of the MC68000 data registers
  374.  
  375. 4) This is a dump of the MC68000 address registers
  376.  
  377. 5) This is a dump of the stack active at the time the invalid memory
  378.    management routine call was made.
  379.  
  380. 6) This is the name of the task and the program name that made the call;
  381.    first the task name, then the CLI program name and the location of the
  382.    call in that program. In some cases, the CLI program name may be omitted
  383.    or the hunk/offset information may not be available.
  384.  
  385. 7) This is a short summary of the history of the memory allocation, stating
  386.    the size of the allocation, where it was allocated and who allocated it.
  387.  
  388. 8) This information is displayed in case memory was trashed. It tells you
  389.    how many bytes were trashed (in this case 1 byte), which byte is the
  390.    first and which is the last to take damage (in this case the first byte
  391.    to be damaged is located at address 0x08568427, the last one at address
  392.    0x08568427), and where the first trashed byte is located in relation to
  393.    the address of the allocation (in this case the last trashed byte
  394.    preceding the allocation is found one byte in front of the allocation
  395.    body). If the relative allocation address is positive, it indicates
  396.    where the first trashed byte to follow the allocation is found in
  397.    relation to the end of the allocation body.
  398.  
  399. 9) This information is displayed in case memory was trashed. It shows what
  400.    data the allocated memory wall was trashed with. Only trashed data will
  401.    be shown, both in a hexadecimal representation and, if possible, in ASCII
  402.    code (at the right hand side of the line).
  403.  
  404.  
  405. 11. Source code
  406.  
  407. For your convenience, the complete program source code is included in the
  408. distribution. Should you find bugs, make updates or enhancements, feel free to
  409. contact me. The source code was written for the SAS/C compiler.
  410.  
  411.  
  412. 12. Why Wipeout?
  413.  
  414. Too much surf music? No. I found MungWall needlessly cryptic to use; what are
  415. those "A: and C: addresses" anyway? And no matter what I did, MungWall always
  416. appeared to come up with the wrong options enabled. That and the fact that it
  417. could not track or detect errors in memory pool allocations made it a prime
  418. candidate for retirement. I had just written a program that used memory pools
  419. extensively and tracking possible bugs in it was no fun at all.
  420.  
  421.  
  422. 13. Author information
  423.  
  424. If you wish to contact me about Wipeout, you can use the following postal
  425. address:
  426.  
  427.    Olaf Barthel
  428.    Brabeckstrasse 35
  429.    D-30559 Hannover
  430.    Federal Republic of Germany
  431.  
  432. or you can use this e-mail address:
  433.  
  434.    olsen@sourcery.han.de
  435.  
  436.  
  437. 14. Release history
  438.  
  439. Wipeout 1.28 (7.10.99)
  440.  
  441.     - No longer tries to track allocations larger than 0x7FFFFFFF
  442.       bytes. This avoids an overflow error which can cause memory
  443.       allocations to succeed which should really fail.
  444.  
  445. Wipeout 1.27 (31.5.98)
  446.  
  447.     - All date stamps printed by the program were missing the extra,
  448.       separating space between time and date. I got caught by
  449.       irregularities introduced by the locale system. Now the date
  450.       and time conversion code strips off all heading/trailing spaces
  451.       before composing the string into a single line [Henrik Holst].
  452.  
  453. Wipeout 1.26 (31.5.98)
  454.  
  455.     - Changed the default options not to enforce the consistency
  456.       check. While this check does make sense, it introduces too
  457.       much overhead and slows the machine down. If you really need
  458.       it, better enable it manually.
  459.  
  460. Wipeout 1.25 (18.4.98)
  461.  
  462.     - Contrary to the documentation, the minimum number of stack lines
  463.       was not 0, but 1. Fixed.
  464.  
  465. Wipeout 1.24 (16.4.98)
  466.  
  467.     - Memory pools created were not tagged correctly.
  468.  
  469. Wipeout 1.23 (16.4.98)
  470.  
  471.     - Enhanced the NAMETAG option so that orphaned pools and
  472.       allocations are easier to recognize.
  473.  
  474. Wipeout 1.22 (16.4.98)
  475.  
  476.     - The consistency checks did not work out well due to the magic
  477.       header cookie getting reset for dead allocations. The code now
  478.       takes this into account.
  479.  
  480.     - When memory is released, not just the allocation body will be
  481.       trashed, the entire data structure including header and walls
  482.       will be filled with the memory munge pattern.
  483.  
  484.     - Releasing an entire memory pool now has the effect of trashing
  485.       every single allocation inside.
  486.  
  487. Wipeout 1.21 (14.4.98)
  488.  
  489.     - The MARK/UNMARK feature did change the memory marks, but forgot
  490.       to update the memory allocation checksum. Fixed.
  491.  
  492.     - Added the CONSISTENCECHECK/NOCONSISTENCECHECK options and the
  493.       corresponding functionality.
  494.  
  495. Wipeout 1.20 (13.4.98)
  496.  
  497.     - Initial public release
  498.